//
//  WBNetworkManager.swift
//  Weibo
//
//  Created by FF on 16/12/19.
//  Copyright © 2016年 Cold Wind. All rights reserved.
//

import UIKit
import AFNetworking

enum WBHTTPMethod {
    case GET
    case POST
}
// 网络管理工具
class WBNetworkManager: AFHTTPSessionManager {
    
    /// 静态区 & 常量区   常量/ 闭包 在第一次访问时执行闭包 并且将结果保存在shared中，和懒加载比较像
    static let shared = WBNetworkManager()
    //lazy var xxx = UIButton()
    
    /// 访问令牌，所有网络请求需有令牌（登陆除外）
    /// 为了保护用户安全，token是有时限的，默认用户是三天
    /// 模拟token过期，服务器返回的状态码是403
    var access_token: String? = "2.00wCA74B0RWfQB71a4f13865ElJr1D"
    
    
    func tokenRequest(method: WBHTTPMethod = .GET, URLString: String, parameters: [String: Any]?, completion: @escaping (_ json: AnyObject?, _ isSuccess: Bool) -> ()) {
        
        // 处理token 字典
        // 1> 判断token 字典是否为nil ，如果为nil 直接返回
        guard let token = access_token else {
            print("没有token 需要登陆！")
        // FIXME: 发送通知，提示用户登陆（此方法不知被谁调用，谁接收到通知，谁处理）
            completion(nil, false)
            return
        }
        // 2> 判断参数字典是否存在，如果为nil ，应新建个字典
        var parameters = parameters
        if parameters == nil {
            parameters = [String: Any]()
        }
        // 3> 设置参数字典
        //parameters = ["access_token": token]
        parameters!["access_token"] = token
        
        // 发起真正的网络请求
        request(method: method, URLString: URLString, parameters: parameters, completion: completion)
        
    }

    /// 封装AFN get 、 post 方法
    ///
    /// - Parameters:
    ///   - method: GET / POST
    ///   - URLString: URLString
    ///   - parameters: 参数字典
    ///   - completion: 完成回调 [json（字典 / 数组）, 是否成功]
    func request(method: WBHTTPMethod = .GET, URLString: String, parameters: [String: Any]?, completion: @escaping (_ json: AnyObject?, _ isSuccess: Bool) -> ()) {
        // 成功回调
        let success = { (task: URLSessionDataTask, json: Any) -> () in
            completion(json as AnyObject?, true)
        }
        // 失败回调
        let failure = { (task: URLSessionDataTask?, error: Error) -> () in

            // 针对403 处理用户token过期
            if (task?.response as? HTTPURLResponse)?.statusCode == 403 {
                print("token过期了")
                // FIXME: 发送通知，提示用户登陆（此方法不知被谁调用，谁接收到通知，谁处理）
            }
            // error 不需要返给用户，影响体验
            print("网络请求失败\(error)")
            completion(nil, false)
        }
        
        if method == .GET {
            get(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
        }else {
            post(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
    }
    }
}
